package controllers

import (
	"stacks/models"
	"stacks/query"
	"stacks/services"
	"stacks/utils"
	"strconv"

	"github.com/gin-gonic/gin"
)

// UserController 用户控制器
type UserController struct {
	userService *services.UserService
}

// NewUserController 创建用户控制器实例
func NewUserController() *UserController {
	return &UserController{
		userService: services.NewUserService(),
	}
}

// GetUserList 获取用户列表
// @Summary 获取用户列表
// @Description 获取用户列表（需要认证）
// @Tags 用户管理
// @Accept json
// @Produce json
// @Security ApiKeyAuth
// @Param page query int false "页码" default(1)
// @Param pageSize query int false "每页数量" default(10)
// @Param keyword query string false "关键词搜索"
// @Param status query int false "状态筛选"
// @Param tenantId query int false "租户ID"
// @Param username query string false "用户名"
// @Param email query string false "邮箱"
// @Param phone query string false "手机号"
// @Param startTime query string false "开始时间"
// @Param endTime query string false "结束时间"
// @Success 200 {object} map[string]interface{} "用户列表"
// @Failure 401 {object} map[string]interface{} "未授权"
// @Failure 500 {object} map[string]interface{} "服务器内部错误"
// @Router /admin/users [get]
func (c *UserController) GetUserList(ctx *gin.Context) {
	parser := utils.NewParamParser(ctx)

	// 使用新的泛型查询参数
	query := utils.PageAutoBind[query.UserQuery](parser)

	result := c.userService.GetUserList(query)

	utils.Success(ctx, result)
}

// GetUserByID 根据ID获取用户
// @Summary 获取用户详情
// @Description 根据ID获取用户详情（需要认证）
// @Tags 用户管理
// @Accept json
// @Produce json
// @Security ApiKeyAuth
// @Param id path int true "用户ID"
// @Success 200 {object} map[string]interface{} "用户详情"
// @Failure 401 {object} map[string]interface{} "未授权"
// @Failure 404 {object} map[string]interface{} "用户不存在"
// @Router /admin/users/{id} [get]
func (c *UserController) GetUserByID(ctx *gin.Context) {
	parser := utils.NewParamParser(ctx)
	id := parser.PathUint("id")

	user := c.userService.GetUserByID(id)

	utils.Success(ctx, user)
}

// CreateUser 创建用户
func (c *UserController) CreateUser(ctx *gin.Context) {
	parser := utils.NewParamParser(ctx)
	var user models.SysUser
	parser.Bind(&user)

	c.userService.CreateUser(&user)

	utils.Success(ctx, "创建成功")
}

// UpdateUser 更新用户
func (c *UserController) UpdateUser(ctx *gin.Context) {
	parser := utils.NewParamParser(ctx)
	id := parser.PathUint("id")

	var updates map[string]interface{}
	parser.Bind(&updates)

	c.userService.UpdateUser(id, updates)

	utils.Success(ctx, "更新成功")
}

// DeleteUser 删除用户
func (c *UserController) DeleteUser(ctx *gin.Context) {
	id, _ := strconv.ParseUint(ctx.Param("id"), 10, 32)

	c.userService.DeleteUser(uint(id))

	utils.Success(ctx, "删除成功")
}
